/* Trabajo Practico 4 (Primera Entrega)
# Servidor Maestro
#
# - Integrantes:
#	- Martinez, Guillermo		DNI: 34510461
#	- Rodriguez, Lucas			DNI: 34265017
*/

#include "include/defines.h"
#include "include/sockets/sockets.h"
#include <queue>

using namespace std;       

// Thread que gestiona primera ronda
void *ThreadPrimeraRonda (void *Parm);

DatosJugador EsperaJugador(int sock_descriptor);

// Handler que finaliza servidor
void CerrarDescriptores(int);

// Funcion error
void error(const char*);

void CrearMutexJugadores();
void LiberarMutexJugadores();

//// Variables globales
// Sockets
int sock_descriptor;

ConfiguracionServidor ConfigServer;

// Lista de jugadores
List<DatosJugador> Jugadores;

// Vector que contiene PIDs de servidores partida
vector<pid_t> ServidoresPartidaRonda;

const char _jugadores[]= "/_jugadores";
sem_t* mutex_jugadores;

Mensaje msj;



bool AceptaConexiones = true;

int main()
{
	
	
	umask(0);

	// Manejar la finalizacion
	signal(SIGUSR1,CerrarDescriptores);
	signal(SIGINT ,CerrarDescriptores);
	signal(SIGTERM,CerrarDescriptores);

	InicializarSocket();

	CrearMutexJugadores();
	CrearMemoriaCompartida();

	pthread_t IdThreadPrimeraRonda;
	
	if(pthread_create(&IdThreadPrimeraRonda, NULL, ThreadPrimeraRonda, NULL) != 0)
		error("Error al crear thread de la Ronda Inicial");
		
	bool TorneoTerminado = false;
	
	cout << " -- Servidor TaTeTi Tournament -- " << endl;
	
	// Ciclo principal
	while(!TorneoTerminado)
	{
		cout << "--------- Comienza Ronda" << Ronda << endl;
		
		int PartidosJugadosRonda = 0;
		bool RondaFinalizada = false;
		
		while(!RondaFinalizada)
		{
			
		}
	}
	
	// Informo campeón
	
}

void *ThreadPrimeraRonda (void *Parm)
{
	const int Ronda=1;//Hilo de ejecución solo para la primera ronda

	while(1)
	{
		DatosJugador Jugador1 = EsperaJugador(sock_descriptor);
		if(!AceptaConexiones)		// Acepté pero tengo que cerrarle la conexion
		{
			close(Jugador1.Descriptor);
			break;
		}
		Jugadores.push_back(Jugador1);
		V(mutex_jugadores); //El P() se hace en EsperaJugador

		DatosJugador Jugador2 = EsperaJugador(sock_descriptor);
		if(!AceptaConexiones)
		{
			close(Jugador2.Descriptor);
			break;
		}
		
		// Tengo 2 jugadores, elimino el jugador 1 agregado a la lista
    Jugadores.pop_back();
		CrearServidorPartida(Jugador1, Jugador2, Ronda);
		V(mutex_jugadores); //El P() se hace en EsperaJugador
	}

	V(mutex_jugadores); //El P() se hace en EsperaJugador

	pthread_exit(NULL);
}
